home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 501-525 / disk_519 / avlsort / getline.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  1KB  |  59 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "getline.h"
  4.  
  5. #define    ISSPACE(c)    (isascii(c) && isspace(c))
  6.  
  7. /*----------------------------
  8.  * Read a line from text file.
  9.  *----------------------------
  10.  */
  11.  
  12. int __regargs 
  13. getline (char *buffer, unsigned long textmax, int tabstop, FILE *fd)
  14. {
  15.     register unsigned long len = 0;
  16.     register int ch = ~EOF;
  17.  
  18.     if ( !buffer || !textmax || !fd || feof(fd) )
  19.         return (-1);
  20.  
  21.     while (len+1 < textmax)
  22.     {
  23.         ch = getc(fd);
  24.         if (ch==EOF || ch=='\0' || ch=='\n' || ch=='\r' || ch=='\f')
  25.             break;
  26.  
  27.         if (!tabstop)
  28.             buffer[len++] = ch;
  29.         else if (tabstop < 0)
  30.         {
  31.             if (!ISSPACE(ch))
  32.                 buffer[len++] = ch;
  33.             else if (!len)
  34.                 continue;
  35.             else if (ISSPACE(buffer[len-1]))
  36.                 continue;
  37.             else
  38.                 buffer[len++] = ' ';
  39.         }
  40.         else if (ch == '\t')
  41.         {
  42.             while (len+1 < textmax)
  43.             {
  44.                 buffer[len++] = ' ';
  45.                 if ( (len % tabstop) == 0 )
  46.                     break;
  47.             }
  48.         }
  49.         else
  50.             buffer[len++] = ch;
  51.     }
  52.     if (tabstop < 0)
  53.         while (len && ISSPACE(buffer[len-1]))
  54.             --len;
  55.     buffer[len] = '\0';
  56.     return (ch == EOF && len == 0) ? -1 : (int)len;
  57. }
  58.  
  59.